Fix read of PCX. Commonize mag2degrees. From Ian Mahuron.
authorrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 22 May 2003 21:47:11 +0000 (21:47 +0000)
committerrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 22 May 2003 21:47:11 +0000 (21:47 +0000)
gpsbabel/defs.h
gpsbabel/magproto.c
gpsbabel/pcx.c
gpsbabel/util.c

index 2c0cdb07fe3552a6d4cada41a5a8ffca3e88583a..ef9e5b494c4ba825dc38b1951dcf32f383d75afd 100644 (file)
@@ -363,6 +363,13 @@ void le_write32(void *pp, unsigned i);
 double pdb_read_double(void *p);
 void pdb_write_double(void *pp, double d);
 
+/*
+ * Prototypes for generic conversion routines (util.c).
+ */
+
+double ddmm2degrees(double ddmm_val);
+double degrees2ddmm(double deg_val);
+
 /*
  * A constant for unknown altitude.   It's tempting to just use zero
  * but that's not very nice for the folks near sea level.
index 9b89ace7ba6263c661ce592fa964e8d339cad431..c5ed335305eb8bb468ca45b2f0d71edd1fb7ac65 100644 (file)
@@ -36,7 +36,6 @@ extern gpsdata_type objective;
 
 static char * termread(char *ibuf, int size);
 static void termwrite(char *obuf, int size);
-static double mag2degrees(double mag_val);
 static void mag_readmsg(void);
 static void mag_handon(void);
 static void mag_handoff(void);
@@ -849,10 +848,10 @@ mag_trkparse(char *trkmsg)
        waypt->creation_time = mktime(&tm) + get_tz_offset() ;
 
        if (latdir == 'S') latdeg = -latdeg;
-       waypt->position.latitude.degrees = mag2degrees(latdeg);
+       waypt->position.latitude.degrees = ddmm2degrees(latdeg);
 
        if (lngdir == 'W') lngdeg = -lngdeg;
-       waypt->position.longitude.degrees = mag2degrees(lngdeg);
+       waypt->position.longitude.degrees = ddmm2degrees(lngdeg);
 
        waypt->position.altitude.altitude_meters = alt;
 
@@ -994,26 +993,6 @@ mag_find_token_from_descr(const char *icon)
                return icon_mapping[0].token;
 }
 
-static double 
-mag2degrees(double mag_val)
-{
-       double minutes;
-       double tmp_val;
-       double return_value;
-       int deg;
-
-       /* 
-        * magellan value is DDMM.MM
-        * e.g. 36 3.85 would be coded as 3603.85
-        */
-       tmp_val = mag_val / 100.0;
-       deg = (int) tmp_val;
-       minutes = (tmp_val - deg) * 100.0;
-       minutes /= 60.0;
-       return_value = (double) deg + minutes;
-       return return_value;
-} 
-
 /*
  * Given an incoming waypoint messages of the form:
  * $PMGNWPL,3549.499,N,08650.827,W,0000257,M,HOME,HOME,c*4D
@@ -1053,10 +1032,10 @@ mag_wptparse(char *trkmsg)
        icon_token[i++] = '\0';
        
        if (latdir == 'S') latdeg = -latdeg;
-       waypt->position.latitude.degrees = mag2degrees(latdeg);
+       waypt->position.latitude.degrees = ddmm2degrees(latdeg);
 
        if (lngdir == 'W') lngdeg = -lngdeg;
-       waypt->position.longitude.degrees = mag2degrees(lngdeg);
+       waypt->position.longitude.degrees = ddmm2degrees(lngdeg);
 
        waypt->position.altitude.altitude_meters = alt;
        waypt->shortname = xstrdup(shortname);
index ac36960d220cb93eb035b159f337e9a8f72bbf02..7faa6888ccd5914e89855950eea3fa05f5162a0d 100644 (file)
@@ -93,7 +93,6 @@ data_read(void)
                                desc);
                        sscanf(&ibuf[116], "%d", 
                                &symnum);
-
                        desc[sizeof(desc)-1] = '\0';
                        name[sizeof(name)-1] = '\0';
                        wpt_tmp = xcalloc(sizeof(*wpt_tmp), 1);
@@ -104,8 +103,8 @@ data_read(void)
 
                        if (latdir == 'S') lat = -lat;
                        if (londir == 'W') lon = -lon;
-                       wpt_tmp->position.longitude.degrees = lon/100.0;
-                       wpt_tmp->position.latitude.degrees = lat/100.0;
+                       wpt_tmp->position.longitude.degrees = ddmm2degrees(lon);
+                       wpt_tmp->position.latitude.degrees = ddmm2degrees(lat);
                        waypt_add(wpt_tmp);
                        break;
                default:
@@ -118,16 +117,13 @@ static void
 gpsutil_disp(const waypoint *wpt)
 {
        double lon,lat;
-       signed int ilon, ilat;
        int icon_token = 0;
        char tbuf[1024];
        char *tp = tbuf;
        time_t tm = wpt->creation_time;
 
-       ilon = (signed int)wpt->position.longitude.degrees;
-       ilat = (signed int)wpt->position.latitude.degrees;
-       lon = (ilon * 100.0) + (wpt->position.longitude.degrees - ilon) * 60.0;
-       lat = (ilat * 100.0) + (wpt->position.latitude.degrees - ilat) * 60.0;
+       lon = degrees2ddmm(wpt->position.longitude.degrees);
+       lat = degrees2ddmm(wpt->position.latitude.degrees);
 
        if (tm == 0) 
                tm = time(NULL);
index d67de406358c81cc18caf73b5e7946836f203aa9..d38139105d7501df83f5b269810cbe6595fc675f 100644 (file)
@@ -459,3 +459,18 @@ pdb_write_double(void* ptr, double d)
   }
   return;
 }
+
+// Magellan and PCX formats use this DDMM.mm format
+double ddmm2degrees(double pcx_val) {
+       double minutes;
+       signed int deg;
+       deg = (signed int) (pcx_val / 100.0);
+       minutes = (((pcx_val / 100.0) - deg) * 100.0) / 60.0;
+       return (double) deg + minutes;
+}
+
+double degrees2ddmm(double deg_val) {
+       signed int deg;
+       deg = (signed int) deg_val;
+       return (double) (deg * 100.0) + ((deg_val - deg) * 60.0);
+}